/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BE;

import java.util.List;
//import java.io.*;
import java.util.ArrayList;

/**
 *
 * @author Elessar
 */
public class BEGrafoAlmacen {
    private int n;
    private int m;
    private List<BENodo> grafo;
    private List<Integer> anulados;
    private int cantRacks;
    
    public BEGrafoAlmacen(int n, int m){
        this.cantRacks=0;
        this.anulados= new ArrayList<Integer>();
        this.n=n;
        this.m=m;
        List<BENodo> grafo2 = new ArrayList<BENodo>();
        int cont;
        for (int j=1; j<=m; j++)
            for (int i=1; i<=n; i++){
                cont=(j-1)*n+i;
                BENodo padre = new BENodo();
                padre.setIdNodo(cont);
                padre.setX(i);
                padre.setY(j);
                List<BENodo> vecinos = new ArrayList<BENodo>();
                //arriba
                if (cont-n>0){
                    BENodo hijo = new BENodo();
                    hijo.setIdNodo(cont-n);
                    hijo.setX(i);
                    hijo.setY(j-1);
                    vecinos.add(hijo);
                }
                //derecha
                if (i%n!=0){
                    BENodo hijo = new BENodo();
                    hijo.setIdNodo(cont+1);
                    hijo.setX(i+1);
                    hijo.setY(j);
                    vecinos.add(hijo);
                }
                //izquierda
                if (i%n!=1){
                    BENodo hijo = new BENodo();
                    hijo.setIdNodo(cont-1);
                    hijo.setX(i-1);
                    hijo.setY(j);
                    vecinos.add(hijo);
                }
                //abajo
                if (cont+n<=m*n){
                    BENodo hijo = new BENodo();
                    hijo.setIdNodo(cont+n);
                    hijo.setX(i);
                    hijo.setY(j+1);
                    vecinos.add(hijo);
                }
                padre.setVecinos(vecinos);
                grafo2.add(padre);
            }
        this.grafo=grafo2;
    }
    
//    public void agregarRack (int xRack, int yRack, int longitud){
//        //comprobar si puede agregarse el rack
//        int idnodo=(yRack-1)*n+xRack;
//        for (int i=0; i<longitud; i++){
//            if (verificarNodoOcupado(idnodo+n*i)){
//                System.out.println("El Rack no puede agregarse en la posición (x,y): ("+xRack+","+yRack+")");
//                return;}
//        }
//        for (int i=0; i<longitud; i++)
//            anularNodo(idnodo+n*i);
//        cantRacks++;
//    }
    
//    public boolean verificarNodoOcupado(int idnodo){
//        if (anulados.contains(idnodo))
//            return true;
//        return false;
//    }
    
//    public void anularNodo (int idnodo){
//        BENodo nodoActual = grafo.get(idnodo-1);
//        int idnodoAux;
//        for (int i=0; i<nodoActual.getVecinos().size(); i++){
//            idnodoAux = nodoActual.getVecinos().get(i).getIdNodo();
//            for (int j=0; j<grafo.get(idnodoAux-1).getVecinos().size(); j++)
//                if (grafo.get(idnodoAux-1).getVecinos().get(j).getIdNodo()==idnodo){
//                    grafo.get(idnodoAux-1).getVecinos().remove(j);
//                    break;
//                }
//        }
//        grafo.get(idnodo-1).getVecinos().clear();
//        anulados.add(idnodo);
//    }
    
    public void imprimeGrafo()
    {
        //System.out.println((int)(Math.random()* (5-1)));
        for(int i = 0;i<grafo.size();i++) {       
            System.out.println(grafo.get(i).getIdNodo()+" x:"+grafo.get(i).getX()+" y:"+grafo.get(i).getY());
            for (int j = 0; j < grafo.get(i).getVecinos().size(); j++) {
                System.out.println("  "+grafo.get(i).getVecinos().get(j).getIdNodo()+ " distancia:"+ grafo.get(i).getVecinos().get(j).getDist());
            }
	}
    }

    public List<Integer> getAnulados() {
        return anulados;
    }

    public void setAnulados(List<Integer> anulados) {
        this.anulados = anulados;
    }

    public int getCantRacks() {
        return cantRacks;
    }

    public void setCantRacks(int cantRacks) {
        this.cantRacks = cantRacks;
    }

    public List<BENodo> getGrafo() {
        return grafo;
    }

    public void setGrafo(List<BENodo> grafo) {
        this.grafo = grafo;
    }

    public int getM() {
        return m;
    }

    public void setM(int m) {
        this.m = m;
    }

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }
    
    public int size(){
        return n*m;
    }
    
//    public void imprimeRuta (List<BENodo> ruta, List<Integer> obligatorios){
//        if (ruta.get(0).getIdNodo()==1){
//            ruta.get(0).setX(1);
//            ruta.get(0).setY(1);
//        }
//        int cont=1;
//        String linea="";
//        int direccion=0;
//        //0: hacia arriba (inicial) (y creciendo)
//        //1: hacia la derecha (x creciendo)
//        //2: hacia la izquierda (x disminuyendo)
//        //3: hacia abajo (y disminuyendo)
//        
//        for (int i=0; i<ruta.size()-1; i++){
//            linea+=cont+") ";
//            if (ruta.get(i).getX()<ruta.get(i+1).getX() && ruta.get(i).getY()==ruta.get(i+1).getY()){
//                //hacia la derecha, x creciendo
//                switch(direccion){
//                    case 0: linea+= "Doblar a la derecha y avanzar 1 espacio";
//                        direccion=1;
//                        break;
//                    case 1: linea+= "Avanzar 1 espacio";
//                        //direccion=1;
//                        break;
//                    case 2: linea+= "Dar media vuelta y avanzar 1 espacio";
//                        direccion=1;
//                        break;
//                    case 3: linea+= "Doblar a la izquierda y avanzar 1 espacio";
//                        direccion=1;
//                        break;
//                }
//            }
//            if (ruta.get(i).getX()>ruta.get(i+1).getX() && ruta.get(i).getY()==ruta.get(i+1).getY()){
//                //hacia la izquierda, x disminuyendo
//                switch(direccion){
//                    case 0: linea+= "Doblar a la izquierda y avanzar 1 espacio";
//                        direccion=2;
//                        break;
//                    case 1: linea+= "Dar media vuelta y avanzar 1 espacio";
//                        direccion=2;
//                        break;
//                    case 2: linea+= "Avanzar 1 espacio";
//                        break;
//                    case 3: linea+= "Doblar a la derecha y avanzar 1 espacio";
//                        direccion=2;
//                        break;
//                }
//            }
//            if (ruta.get(i).getX()==ruta.get(i+1).getX() && ruta.get(i).getY()<ruta.get(i+1).getY()){
//                //hacia arriba, y creciendo
//                switch(direccion){
//                    case 0: linea+= "Avanzar 1 espacio";
//                        break;
//                    case 1: linea+= "Doblar a la izquierda y avanzar 1 espacio";
//                        direccion=0;
//                        break;
//                    case 2: linea+= "Doblar a la derecha y avanzar 1 espacio";
//                        direccion=0;
//                        break;
//                    case 3: linea+= "Dar media vuelta y avanzar 1 espacio";
//                        direccion=0;
//                        break;
//                }
//            }
//            if (ruta.get(i).getX()==ruta.get(i+1).getX() && ruta.get(i).getY()>ruta.get(i+1).getY()){
//                //hacia abajo, y disminuyendo
//                switch(direccion){
//                    case 0: linea+= "Dar media vuelta y avanzar 1 espacio";
//                        direccion=3;
//                        break;
//                    case 1: linea+= "Doblar a la derecha y avanzar 1 espacio";
//                        direccion=3;
//                        break;
//                    case 2: linea+= "Doblar a la izquierda y avanzar 1 espacio";
//                        direccion=3;
//                        break;
//                    case 3: linea+= "Avanzar 1 espacio";
//                        break;
//                }
//            }
//            linea+=" ("+direccion+")";
//            System.out.println(linea);
//            linea="";
//            cont++;
//            if (obligatorios.contains(ruta.get(i).getIdNodo())){
//                System.out.println(cont+") Descargar pallet (fila:__, columna:__)");
//                cont++;
//            }                
//        }
//    }
    
//    public int buscarNodoRutaRack (int x, int y){
//        int idnodoRack = (y-1)*n+x;
//        int idnodoIzq = idnodoRack-1;
//        int idnodoDer = idnodoRack+1;        
//        if (!anulados.contains(idnodoIzq))
//            return idnodoIzq;
//        if (!anulados.contains(idnodoDer))
//            return idnodoDer;
//        System.out.println("ERROR: Rack mal ubicado");
//        return -1;
//    }
}
